package br.com.saeng2D.superficie.builder;

import java.awt.event.MouseEvent;

import br.com.saeng2D.formulario.FormularioPrincipal;
import br.com.saeng2D.objeto.AbstratoObjeto;
import br.com.saeng2D.objeto.linha.Linha;
import br.com.saeng2D.objeto.ponto.Ponto;
import br.com.saeng2D.superficie.Superficie;
import br.com.saeng2D.superficie.manipl.AbstratoManipulador;
import br.com.saeng2D.util.Util;

//Cria linhas a medida que houver arrasto de mouse na superfície
public class LinhaArrastoBuilder extends AbstratoManipulador {
	private Linha linha;

	//Construtor
	public LinhaArrastoBuilder(Superficie superficie) {
		super(superficie);
	}

	public void mouseClicked(MouseEvent e) {
	}

	public synchronized void mousePressed(MouseEvent e) {
		int x = e.getX();
		int y = e.getY();
		Ponto ponto1 = new Ponto(x, y);
		Ponto ponto2 = new Ponto(x, y);
		linha = new Linha(ponto1, ponto2);
		linha.normalizarPonto1();

		boolean pontoExistente = false;
		
		if(superficie.getQtdObjetos() == 0) {
			pontoExistente = true;
		} else {
			for(AbstratoObjeto objeto : superficie.getObjetos()) {
				if(objeto instanceof Linha) {
					Linha linha = (Linha) objeto;
					if(linha.getPonto1().ehIgual(ponto1) || linha.getPonto2().ehIgual(ponto1)) {
						pontoExistente = true;
						break;
					}
				}
			}
		}
		
		if(!pontoExistente) {
			Util.mensagem(superficie.getFormularioPrincipal(), Util.getString("msg_criacao_linha_ponto_existente"));
		} else {
			superficie.adicionarObjeto(linha);
		}
	}
	
	public void mouseDragged(MouseEvent e) {
		atualizarTitulo(e);
		linha.getPonto2().setX(e.getX());
		linha.getPonto2().setY(e.getY());
		superficie.repaint();
		FormularioPrincipal.atualizarLabelStatus(linha);
	}

	public void mouseEntered(MouseEvent e) {
	}

	public void mouseExited(MouseEvent e) {
	}

	public void mouseMoved(MouseEvent e) {
		atualizarTitulo(e);
	}

	public void mouseReleased(MouseEvent e) {
		linha.normalizarPonto2();
		if(linha.getComprimento() <= Util.getInt("comprimento_minimo_linha")) {
			Util.mensagem(superficie.getFormularioPrincipal(), Util.getString("msg_linha_comp_minimo"));
			superficie.excluirObjeto(linha);
		} else {
			superficie.repaint();
		}
		superficie.repaint();
		FormularioPrincipal.atualizarLabelStatus(linha);
	}

	public void antesSubstituicao() {
	}

	public void aposSubstituicao() {
	}
}